// 数组类型数据进行数据劫持
//1.获取原来的数组方法
let oldArrayMethods = Array.prototype // Array.prototype:数组原型
// 2.继承原型方法
let ArrayMethods = Object.create(oldArrayMethods)
//劫持
let methods = ["push", "pop", "shift", "unshift", "splice", "reverse", "sort"]
methods.forEach((item) => {
  ArrayMethods[item] = function (...args) {
    // console.log("劫持数组方法")
    // 1.调用原来的方法
    let result = oldArrayMethods[item].apply(this, args) //注意this指向,让this执行被执行数组,
    // 2.可执行对数组进行自定义操作
    // 问题:对数组中新增对象元素没有得到劫持
    // 解决方案:添加对对象的劫持
    // console.log(args)
    let inserted
    switch (item) {
      //新增
      case "push":
        inserted = args
        break
      case "unshift":
        inserted = args
        break
      case "splice":
        inserted = args.splice(2)
        break
    }
    let ob = this.__ob__//得到数组对应的observer实例,此时this执行数组
    if(inserted){
      ob.observerArray(inserted)//对数组中添加的对象进行劫持
    }
    // 3.返回操作结果
    return result
  }
})
export { ArrayMethods }
